Skip to content

Conversation

@jonathannorris
Copy link
Member

Summary

Refactors the multi-provider implementation by moving duplicate code from @openfeature/server-sdk and @openfeature/web-sdk into @openfeature/shared.

Changes

  • Moved to shared package:

    • StatusTracker - Generic status tracking for multiple providers
    • BaseEvaluationStrategy and concrete strategy implementations (FirstMatchStrategy, FirstSuccessfulStrategy, ComparisonStrategy)
    • Multi-provider error handling utilities
    • Common multi-provider types (ProviderEntryInput, RegisteredProvider)
  • Made generic and type-safe:

    • All shared types now use proper generic type parameters (TProviderStatus, TProvider)
    • Removed all any types in favor of explicit generic constraints
    • Added proper type constraints to StatusTracker for provider compatibility
  • Updated implementations:

    • Server and web multi-provider implementations now import and use shared code
    • Both SDKs specify their concrete types (ProviderStatus, Provider) when using shared utilities
    • Maintained full type safety across all packages

Cleanup: removing `release-as` properties from release-please config
after successfully validating OIDC npm publishing.

<!-- av pr metadata
This information is embedded by the av CLI when creating PRs to track
the status of stacks when using Aviator. Please do not delete or edit
this section of the PR.
```
{"parent":"main","parentHead":"","trunk":"main"}
```
-->

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
This PR migrates the `MultiProvider` functionality from the
[js-sdk-contrib](https://github.com/open-feature/js-sdk-contrib)
repository into the main js-sdk, providing built-in support for
multi-provider evaluation strategies. Addresses #1217

### What's Changed
- **Added `MultiProvider`** for server SDK with support for multiple
evaluation strategies
- **Added `WebMultiProvider`** for web SDK with web-specific
optimizations
- **Included 3 evaluation strategies**: FirstMatch, FirstSuccessful, and
Comparison
- **Comprehensive test coverage** for both server and web
implementations
- **Updated documentation** with usage examples and strategy
explanations

### Testing
- ✅ All existing tests pass
- ✅ New comprehensive test suites for both server and web MultiProvider
- ✅ ESLint compliance across all new code

---------

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
@jonathannorris jonathannorris force-pushed the feat-shared-multi-provider branch from 92cf47a to 847278f Compare October 21, 2025 19:40
jonathannorris and others added 24 commits October 21, 2025 20:36
…ror logging (#1267)

Addresses feedback from #1265 (Gemini bot review comments).

## Changes

1. **Fixed documentation mismatch**: Updated all code examples to use
`MultiProvider` instead of incorrect `WebMultiProvider` class name
   - `packages/web/README.md` (4 occurrences)
- `packages/web/src/provider/multi-provider/README.md` (4 occurrences)

2. **Removed duplicate error logging**: Fixed redundant stack trace
logging in `hook-executor.ts` where errors were being logged twice in
both `errorHooks` and `finallyHooks` methods

<!-- av pr metadata
This information is embedded by the av CLI when creating PRs to track
the status of stacks when using Aviator. Please do not delete or edit
this section of the PR.
```
{"parent":"main","parentHead":"","trunk":"main"}
```
-->

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
🤖 I have created a release *beep* *boop*
---


##
[1.20.0](server-sdk-v1.19.0...server-sdk-v1.20.0)
(2025-10-21)


### ✨ New Features

* Migrate MultiProvider from js-sdk-contrib
([#1234](#1234))
([8686dbf](8686dbf))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---


##
[1.7.0](web-sdk-v1.6.2...web-sdk-v1.7.0)
(2025-10-21)


### ✨ New Features

* Migrate MultiProvider from js-sdk-contrib
([#1234](#1234))
([8686dbf](8686dbf))


### 🐛 Bug Fixes

* correct MultiProvider class name in docs and remove duplicate error
logging ([#1267](#1267))
([18c2719](18c2719))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
## Description
Adds the `Multi-Provider` feature to the features list in both the
server and web SDK package READMEs.

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
## This PR

👋 Maybe I'm missing something, but `useOpenFeatureClient` currently
returns an unstable `client` that is recreated every time the provider
re-renders, if you pass a domain into the provider instead of a specific
client.

This PR wraps the creation of that client when a domain is passed in
`useMemo`, which should ensure that it is then stable for downstream
usage via the `useOpenFeatureClient` hook.

As an example, due to `client` being unstable (combined with the
`shouldRunNow` behaviour in the client), this logs `ready` every time
the provider re-renders rather than just once when the client is
actually ready.

```ts
  const client = useOpenFeatureClient();
  useEffect(() => {
    const ready = () => {
      console.log('ready');
    };

    client.addHandler(ProviderEvents.Ready, ready);
    return () => {
      client.removeHandler(ProviderEvents.Ready, ready);
    };
  }, [client]);
```

The closest workaround I've found currently is checking if the domain
matches w/ `useState` + `useEffect`:

```ts
  const client = useOpenFeatureClient();

  const [stableClient, setStableClient] = useState(client);
  useEffect(() => {
    setStableClient((existing) => (existing.metadata.domain === client.metadata.domain ? existing : client));
  }, [client]);

  useEffect(() => {
    const ready = () => {
      console.log('ready');
    };

    stableClient.addHandler(ProviderEvents.Ready, ready);
    return () => {
      stableClient.removeHandler(ProviderEvents.Ready, ready);
    };
  }, [stableClient]);

---------

Signed-off-by: Matt Cowley <me@mattcowley.co.uk>
Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
## This PR

Failure first appeared in
https://github.com/open-feature/js-sdk/actions/runs/18692818359/job/53302526714
-- noticed it locally while adding the test in #1276, and then saw the
failure on main when my PR was merged.

Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
🤖 I have created a release *beep* *boop*
---


##
[1.7.1](web-sdk-v1.7.0...web-sdk-v1.7.1)
(2025-10-31)


### 📚 Documentation

* add Multi-Provider to features list in README's
([#1269](#1269))
([752fa0d](752fa0d))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [typescript](https://www.typescriptlang.org/)
([source](https://redirect.github.com/microsoft/TypeScript)) | [`5.8.3`
-> `5.9.3`](https://renovatebot.com/diffs/npm/typescript/5.8.3/5.9.3) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/typescript/5.9.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/typescript/5.8.3/5.9.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>microsoft/TypeScript (typescript)</summary>

###
[`v5.9.3`](https://redirect.github.com/microsoft/TypeScript/releases/tag/v5.9.3):
TypeScript 5.9.3

[Compare
Source](https://redirect.github.com/microsoft/TypeScript/compare/v5.9.2...v5.9.3)

Note: this tag was recreated to point at the correct commit. The npm
package contained the correct content.

For release notes, check out the [release
announcement](https://devblogs.microsoft.com/typescript/announcing-typescript-5-9/)

- [fixed issues query for Typescript 5.9.0
(Beta)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.0%22+is%3Aclosed+).
- [fixed issues query for Typescript 5.9.1
(RC)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.1%22+is%3Aclosed+).
- *No specific changes for TypeScript 5.9.2 (Stable)*
- [fixed issues query for Typescript 5.9.3
(Stable)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.3%22+is%3Aclosed+).

Downloads are available on:

- [npm](https://www.npmjs.com/package/typescript)

###
[`v5.9.2`](https://redirect.github.com/microsoft/TypeScript/releases/tag/v5.9.2):
TypeScript 5.9

[Compare
Source](https://redirect.github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2)

Note: this tag was recreated to point at the correct commit. The npm
package contained the correct content.

For release notes, check out the [release
announcement](https://devblogs.microsoft.com/typescript/announcing-typescript-5-9/)

- [fixed issues query for Typescript 5.9.0
(Beta)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.0%22+is%3Aclosed+).
- [fixed issues query for Typescript 5.9.1
(RC)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.1%22+is%3Aclosed+).
- *No specific changes for TypeScript 5.9.2 (Stable)*

Downloads are available on:

- [npm](https://www.npmjs.com/package/typescript)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjE1Ni4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---


##
[1.0.2](react-sdk-v1.0.1...react-sdk-v1.0.2)
(2025-10-31)


### 🐛 Bug Fixes

* memoize React client to provide stability
([#1276](#1276))
([405d61d](405d61d))


### 🧹 Chore

* mention debounce hook in react/ng docs
([#1272](#1272))
([27666b8](27666b8))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
- update copyright to OpenFeature Maintainers

---------

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
Fixing an issue with the MultiProvider where hook contexts and hints
were being lost due to copies of the context data being created in the
OpenFeature sdk evaluation.

Since key evaluation of Maps using objects is done by reference, the
lookup of the context during evaluation was failing, leading to errors.

- adds this new feature

### Related Issues

Fixes #1268

### Notes

### Follow-up Tasks

### How to test

---------

Signed-off-by: Mike Kitzman <mdkitzman@gmail.com>
…on with googleapis/release-please-action (#1278)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[google-github-actions/release-please-action](https://redirect.github.com/google-github-actions/release-please-action)
→
[googleapis/release-please-action](https://redirect.github.com/google-github-actions/release-please-action)
| action | replacement | `v3` -> `v3` |

This is a special PR that replaces
`google-github-actions/release-please-action` with the community
suggested minimal stable replacement version.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNTkuNCIsInVwZGF0ZWRJblZlciI6IjQyLjE2LjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR:

- clarifies some doc around `useWhenProviderReady` (it really only works
with READY)
- moves AbortController instantiation so we don't create it every render
if we don't need to

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
## This PR

- updated the `isEqual` function to compare any input
- updated the compare to evaluate the whole EvaluationDetails object
instead of just the value

### Related Issues

Fixes #1286

### Notes

This may trigger slightly more re-renders but I feel that that's better
than return stale EvaluationDetails data which has proven to be
confusing to folks attempting to debug unexpected evaluations.

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
## This PR

Allows for `setContext` returned by the `useContextMutator` hook to be
passed a method that returns the new context, with the current
(previous) context passed into it. This aligns the signature of
`setContext` to the setter of a regular `useState` hook, making it
easier to conditionally update the context without needing to keep track
of the domain separately from the React context.

---------

Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
…y] (#1304)

> **Note:** This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@angular/compiler](https://redirect.github.com/angular/angular)
([source](https://redirect.github.com/angular/angular/tree/HEAD/packages/compiler))
| [`20.1.2` ->
`20.3.15`](https://renovatebot.com/diffs/npm/@angular%2fcompiler/20.1.2/20.3.15)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@angular%2fcompiler/20.3.15?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular%2fcompiler/20.1.2/20.3.15?slim=true)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-66412](https://redirect.github.com/angular/angular/security/advisories/GHSA-v4hv-rgfq-gp49)

A **Stored Cross-Site Scripting
([XSS](https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss))**
vulnerability has been identified in the **Angular Template Compiler**.
It occurs because the compiler's internal security schema is incomplete,
allowing attackers to bypass Angular's built-in security sanitization.
Specifically, the schema fails to classify certain URL-holding
attributes (e.g., those that could contain [`javascript:`
URLs](https://developer.mozilla.org/en-US/Web/URI/Reference/Schemes/javascript))
as requiring strict URL security, enabling the injection of malicious
scripts.

Additionally, a related vulnerability exists involving SVG animation
elements (`<animate>`, `<set>`, `<animateMotion>`,
`<animateTransform>`). The `attributeName` attribute on these elements
was not properly validated, allowing attackers to dynamically target
security-sensitive attributes like `href` or `xlink:href` on other
elements. By binding `attributeName` to "href" and providing a
`javascript:` URL in the `values` or `to` attribute, an attacker could
bypass sanitization and execute arbitrary code.

Attributes confirmed to be vulnerable include:
* SVG-related attributes: (e.g., `xlink:href`), and various MathML
attributes (e.g., `math|href`, `annotation|href`).
* SVG animation `attributeName` attribute when bound to "href" or
"xlink:href".

When template binding is used to assign untrusted, user-controlled data
to these attributes (e.g., `[attr.xlink:href]="maliciousURL"` or
`<animate [attributeName]="'href'" [values]="maliciousURL">`), the
compiler incorrectly falls back to a non-sanitizing context or fails to
block the dangerous attribute assignment. This allows an attacker to
inject a `javascript:URL` payload. Upon user interaction (like a click)
on the element, or automatically in the case of animations, the
malicious JavaScript executes in the context of the application's
origin.

### Impact

When exploited, this vulnerability allows an attacker to execute
arbitrary code within the context of the vulnerable application's
domain. This enables:

* **Session Hijacking:** Stealing session cookies and authentication
tokens.
* **Data Exfiltration:** Capturing and transmitting sensitive user data.
* **Unauthorized Actions:** Performing actions on behalf of the user.

### Patches

- 19.2.17
- 20.3.15
- 21.0.2

### Attack Preconditions

* The victim's Angular application must render data derived from
**untrusted input** (e.g., from a database or API) and bind it to one of
the unsanitized URL attributes or the `attributeName` of an SVG
animation element.
* The victim must perform a **user interaction** (e.g., clicking) on the
compromised element for the stored script to execute, or the animation
must trigger the execution.

### Workarounds

If you cannot upgrade, you can workaround the issue by ensuring that any
data bound to the vulnerable attributes is never sourced from untrusted
user input (e.g., database, API response, URL parameters).

* **Avoid Affected Template Bindings:** Specifically avoid using
template bindings (e.g., `[attr.xlink:href]="maliciousURL"`) to assign
untrusted data to the vulnerable SVG/MathML attributes.
* **Avoid Dynamic `attributeName` on SVG Animations:** Do not bind
untrusted data to the `attributeName` attribute of SVG animation
elements (`<animate>`, `<set>`, etc.).
* **Enable [Content Security Policy
(CSP)](https://angular.dev/best-practices/security#content-security-policy):**
Configure a robust CSP header that disallows `javascript:` URLs.

---

### Release Notes

<details>
<summary>angular/angular (@&#8203;angular/compiler)</summary>

###
[`v20.3.15`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20315-2025-12-01)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.14...20.3.15)

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
----------------------------------------------------------------- |
|
[d1ca8ae043](https://redirect.github.com/angular/angular/commit/d1ca8ae04390f050039fdb653a6147d75d48f81e)
| fix | prevent XSS via SVG animation `attributeName` and MathML/SVG
URLs |

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.14`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20314-2025-11-25)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.13...20.3.14)

##### http

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- | ---------------------------------------------------- |
|
[0276479e7d](https://redirect.github.com/angular/angular/commit/0276479e7d0e280e0f8d26fa567d3b7aa97a516f)
| fix | prevent XSRF token leakage to protocol-relative URLs |

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.13`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20313-2025-11-19)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.12...20.3.13)

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.12`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20312-2025-11-14)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.11...20.3.12)

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.11`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20311-2025-11-12)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.10...20.3.11)

##### common

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- | ------------------------------------------------------- |
|
[5047849a4a](https://redirect.github.com/angular/angular/commit/5047849a4a1857471b78b7ba874f39ecd6175a6b)
| fix | remove placeholder image listeners once view is removed |

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- | -------------------------------------------------- |
|
[f9d0818087](https://redirect.github.com/angular/angular/commit/f9d08180876eb0aee5e5c489be734b07a7cc664e)
| fix | support arbitrary nesting in :host-context() |
|
[106b9040df](https://redirect.github.com/angular/angular/commit/106b9040dfe03bd8deb0eabccc29e07f734b6ab5)
| fix | support commas in :host() argument |
|
[9419ea348a](https://redirect.github.com/angular/angular/commit/9419ea348a296b50f13ac2e23ea9a00b336989b8)
| fix | support complex selectors in :nth-child() |
|
[036c5d2a07](https://redirect.github.com/angular/angular/commit/036c5d2a073f8e48704ec0d405ca997eedb721e9)
| fix | support one additional level of nesting in :host() |

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- | ----------------------------------- |
|
[dcdd1bcdbb](https://redirect.github.com/angular/angular/commit/dcdd1bcdbbd2a2fb4bd1fc4330259824d0bc8cb9)
| fix | skip leave animations on view swaps |

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.10`](https://redirect.github.com/angular/angular/releases/tag/20.3.10)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.9...20.3.10)

##### compiler-cli

| Commit | Description |
|
------------------------------------------------------------------------------------------------------------------------------------------------------------
| ------------------------------------------ |
| [![fix -
840db59dc1](https://img.shields.io/badge/840db59dc1-fix-green)](https://redirect.github.com/angular/angular/commit/840db59dc1a9beb0b4e63799b5d56c2f096a1bab)
| make required inputs diagnostic less noisy |

##### migrations

| Commit | Description |
|
------------------------------------------------------------------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
| [![fix -
a45e6b2b66](https://img.shields.io/badge/a45e6b2b66-fix-green)](https://redirect.github.com/angular/angular/commit/a45e6b2b66f669c532d6bffbab65058edabcacd9)
| Prevent removal of templates referenced with preceding whitespace
characters |

###
[`v20.3.9`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2039-2025-10-29)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.7...20.3.9)

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.7`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2037-2025-10-22)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.6...20.3.7)

##### animations

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
--------------------------------------------------------------------------------------------------
|
|
[bd38cd45a5](https://redirect.github.com/angular/angular/commit/bd38cd45a5fb81e92b91e582d7b13aa3b21f3839)
| fix | account for `Element.animate` exceptions
([#&#8203;64506](https://redirect.github.com/angular/angular/pull/64506))
|

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------------------
|
|
[891f180262](https://redirect.github.com/angular/angular/commit/891f18026243bcf8c8b82881a73dffa283d0dd11)
| fix | correctly compile long numeric HTML entities
([#&#8203;64297](https://redirect.github.com/angular/angular/pull/64297))
|

##### compiler-cli

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------------------------------------
|
|
[371274bfc6](https://redirect.github.com/angular/angular/commit/371274bfc6d5690390f90161106b60d80939fe75)
| fix | missingStructuralDirective diagnostic produces false negatives
([#&#8203;64470](https://redirect.github.com/angular/angular/pull/64470))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------------------------------------
|
|
[4c89a267c3](https://redirect.github.com/angular/angular/commit/4c89a267c3b49e928332232ec2a3023f6fb4046d)
| fix | pass element removal property through in all locations
([#&#8203;64565](https://redirect.github.com/angular/angular/pull/64565))
|
|
[2fad4d4ab6](https://redirect.github.com/angular/angular/commit/2fad4d4ab63a2a8326af02b0f2f7d285c7f42e0d)
| fix | prevent duplicate nodes from being retained with fast
\`animate.leave\`\` calls
([#&#8203;64592](https://redirect.github.com/angular/angular/pull/64592))
|

##### router

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------------------
|
|
[cfd8ed3fff](https://redirect.github.com/angular/angular/commit/cfd8ed3fff02af93b3fbd2e3f3a47128bd3582bf)
| fix | Fix outlet serialization and parsing with no primary children
([#&#8203;64505](https://redirect.github.com/angular/angular/pull/64505))
|
|
[182fe78f91](https://redirect.github.com/angular/angular/commit/182fe78f91d04ac8d25a32bce0ea180a6fe557ce)
| fix | Surface parse errors in Router.parseUrl
([#&#8203;64503](https://redirect.github.com/angular/angular/pull/64503))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.6`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2036-2025-10-16)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.5...20.3.6)

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------
|
|
[911d6822cb](https://redirect.github.com/angular/angular/commit/911d6822cb18dabf4f72312dfc2e2ef9904bf6c2)
| fix | update animation scheduling
([#&#8203;64441](https://redirect.github.com/angular/angular/pull/64441))
|

##### platform-browser

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------------------------------------------------
|
|
[2ece42866d](https://redirect.github.com/angular/angular/commit/2ece42866d0ee8240e73ebcef79ba47378777368)
| fix | `DomEventsPlugin` should always be the last plugin to be called
for `supports()`.
([#&#8203;50394](https://redirect.github.com/angular/angular/pull/50394))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.5`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2035-2025-10-15)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.4...20.3.5)

##### compiler-cli

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
[8dec92ff9f](https://redirect.github.com/angular/angular/commit/8dec92ff9f1055c6b4fc4e767d8b1b408ac28e67)
| fix | capture metadata for undecorated fields
([#&#8203;63957](https://redirect.github.com/angular/angular/pull/63957))
([#&#8203;64317](https://redirect.github.com/angular/angular/pull/64317))
|
|
[c2e817b0ef](https://redirect.github.com/angular/angular/commit/c2e817b0efb6f617312936b756ace2c85139d1fc)
| perf | fix performance of "interpolated signal not invoked" check
([#&#8203;64410](https://redirect.github.com/angular/angular/pull/64410))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
---------------------------------------------------------------------------------------------------------------
|
|
[f15cfa4cc4](https://redirect.github.com/angular/angular/commit/f15cfa4cc414f1d2f4b126bdfc26d74922732672)
| fix | fixes regression in `animate.leave` function bindings
([#&#8203;64413](https://redirect.github.com/angular/angular/pull/64413))
|
|
[d54dd674ca](https://redirect.github.com/angular/angular/commit/d54dd674ca9db874c95027161b8080bd37250af6)
| fix | Prevents early style pruning with leave animations
([#&#8203;64335](https://redirect.github.com/angular/angular/pull/64335))
|

##### migrations

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
[554573e524](https://redirect.github.com/angular/angular/commit/554573e5248a72f73df1468e992da08ce5f6112d)
| fix | migrating input with more than 1 usage in a method
([#&#8203;64367](https://redirect.github.com/angular/angular/pull/64367))
|
|
[2c79ca0b57](https://redirect.github.com/angular/angular/commit/2c79ca0b579d99346c267e6b61789699e8656dc5)
| fix | remove error for no matching files in control flow migration
([#&#8203;64253](https://redirect.github.com/angular/angular/pull/64253))
([#&#8203;64314](https://redirect.github.com/angular/angular/pull/64314))
|

##### router

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------------------------------------------
|
|
[6e4bcc7d22](https://redirect.github.com/angular/angular/commit/6e4bcc7d22d4699a33d6648e628fb65a38d0ad8f)
| fix | Scroll restoration should use instant scroll behavior for
traversals
([#&#8203;64299](https://redirect.github.com/angular/angular/pull/64299))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.4`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2034-2025-10-08)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.3...20.3.4)

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
----------------------------------------------------------------------------------------------------------------------------------------
|
|
[853ed169a8](https://redirect.github.com/angular/angular/commit/853ed169a8a1392ef2da7790181fb8e100f59519)
| fix | ensure missing leave animations don't queue leave animations
([#&#8203;64226](https://redirect.github.com/angular/angular/pull/64226))
|
|
[6fed986b7a](https://redirect.github.com/angular/angular/commit/6fed986b7a8f22dfe81d94b1e55490a278e6d82a)
| fix | Fixes animations in conjunction with content projection
([#&#8203;63776](https://redirect.github.com/angular/angular/pull/63776))
|
|
[76fe5599fe](https://redirect.github.com/angular/angular/commit/76fe5599fe8e034c2a5a432608785a53018e23d2)
| fix | handle undefined CSS time values in parseCssTimeUnitsToMs
function
([#&#8203;64181](https://redirect.github.com/angular/angular/pull/64181))
|
|
[3b959105be](https://redirect.github.com/angular/angular/commit/3b959105be04d7b11a1eb1035f1938bd0c43fe8b)
| fix | prevent early exit from leave animations when multiple
transitions are present
([#&#8203;64225](https://redirect.github.com/angular/angular/pull/64225))
|

##### migrations

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------------------------------
|
|
[65884895ff](https://redirect.github.com/angular/angular/commit/65884895fff5bc499974849e9ec5a5792eb9e36c)
| fix | preserve component imports when pruning NgModules in standalone
migration
([#&#8203;64186](https://redirect.github.com/angular/angular/pull/64186))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.3`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2033-2025-10-02)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.2...20.3.3)

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------
|
|
[f51ab32fb3](https://redirect.github.com/angular/angular/commit/f51ab32fb3000ae34c077b049ff2f7b8e3e22d14)
| fix | recover template literals with broken expressions
([#&#8203;64150](https://redirect.github.com/angular/angular/pull/64150))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
--------------------------------------------------------------------------------------------------------------------------------
|
|
[542cd0019a](https://redirect.github.com/angular/angular/commit/542cd0019aa509e399282ccf7cb5fa6208cef70e)
| fix | do not rename ARIA property bindings to attributes
([#&#8203;64089](https://redirect.github.com/angular/angular/pull/64089))
|
|
[0e928fbc4a](https://redirect.github.com/angular/angular/commit/0e928fbc4a351303c4ce081a679f4a38c0acd5e6)
| fix | Fixes animations in conjunction with content projection
([#&#8203;63776](https://redirect.github.com/angular/angular/pull/63776))
|
|
[e5157bd933](https://redirect.github.com/angular/angular/commit/e5157bd933c41836fb431659f42dfb4cdbe0d2d1)
| fix | prevents unintended early termination of leave animations and
hoisting
([#&#8203;64088](https://redirect.github.com/angular/angular/pull/64088))
|

##### migrations

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------------------------
|
|
[1710cbd7d4](https://redirect.github.com/angular/angular/commit/1710cbd7d484ccd5e9ab39b95a44e2d222f4262d)
| fix | handle shorthand property declarations in NgModule
([#&#8203;64160](https://redirect.github.com/angular/angular/pull/64160))
|
|
[77b6305a4b](https://redirect.github.com/angular/angular/commit/77b6305a4b5db88f9c1130acf80095b502a0eca1)
| fix | skip migration for inputs with 'this' references
([#&#8203;64142](https://redirect.github.com/angular/angular/pull/64142))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.2`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2032-2025-09-24)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.1...20.3.2)

##### compiler-cli

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------
|
|
[ba40153ac0](https://redirect.github.com/angular/angular/commit/ba40153ac07fc721585a1224fda09a654672cb74)
| fix | capture metadata for undecorated fields
([#&#8203;63904](https://redirect.github.com/angular/angular/pull/63904))
|
|
[1d4f81c8ee](https://redirect.github.com/angular/angular/commit/1d4f81c8eedf5ea69c51c720f8dc5c5d12a62ba2)
| fix | resolve import alias in defer blocks
([#&#8203;63966](https://redirect.github.com/angular/angular/pull/63966))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
--------------------------------------------------------------------------------------------------------------------
|
|
[9515a70933](https://redirect.github.com/angular/angular/commit/9515a709331883f0ca9857ed46a5262b01979a26)
| fix | fix narrowing of `Resource.hasValue()`
([#&#8203;63994](https://redirect.github.com/angular/angular/pull/63994))
|
|
[e78451cf8a](https://redirect.github.com/angular/angular/commit/e78451cf8a48322879e83b33fecc0b5854947afb)
| fix | prevent animations renderer from impacting `animate.leave`
([#&#8203;63921](https://redirect.github.com/angular/angular/pull/63921))
|

##### forms

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------------------
|
|
[1fd8d5d446](https://redirect.github.com/angular/angular/commit/1fd8d5d446f909a16a127ba117a0f423c7a5db0c)
| fix | Emit `FormResetEvent` when resetting control
([#&#8203;64034](https://redirect.github.com/angular/angular/pull/64034))
|

##### migrations

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------
|
|
[16d0d43ad4](https://redirect.github.com/angular/angular/commit/16d0d43ad4903b69b8dcd9b76c48b5089e7f82ee)
| fix | handle import aliases to the same module name
([#&#8203;63934](https://redirect.github.com/angular/angular/pull/63934))
|
|
[3ebaeccb46](https://redirect.github.com/angular/angular/commit/3ebaeccb466119ee43eeaa486f5e132c85e9caa2)
| fix | handle reused templates in control flow migration
([#&#8203;63996](https://redirect.github.com/angular/angular/pull/63996))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.1`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2031-2025-09-17)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.3.0...20.3.1)

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
----------------------------------------------------------------------------------------
|
|
[7fb5a8087e](https://redirect.github.com/angular/angular/commit/7fb5a8087ee8fb0451cedbe6ac4ce972eca4b56e)
| fix | Add support for `aria-invalid`
([#&#8203;63748](https://redirect.github.com/angular/angular/pull/63748))
|

##### compiler-cli

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
---------------------------------------------------------------------------------------------------------------------------------------
|
|
[8843707919](https://redirect.github.com/angular/angular/commit/88437079190cef9ee522a3e2defa6e2672c2d030)
| fix | only bind inputs that are part of microsyntax to a structural
directive
([#&#8203;52453](https://redirect.github.com/angular/angular/pull/52453))
|
|
[38c9921ff3](https://redirect.github.com/angular/angular/commit/38c9921ff387d235981a79e26dc8bc7e60a2e10c)
| fix | signal not invoked diagnostic not raised when input has same
name in template
([#&#8203;63754](https://redirect.github.com/angular/angular/pull/63754))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------------------------
|
|
[802dbcc2a0](https://redirect.github.com/angular/angular/commit/802dbcc2a0c5d3784cb04b4c78ea71ed0925327c)
| fix | prevent animation events from being cleaned up on destroy
([#&#8203;63414](https://redirect.github.com/angular/angular/pull/63414))
|
|
[3ec8a5c753](https://redirect.github.com/angular/angular/commit/3ec8a5c7536cdd2c1db7db4bfbc2d4995156a833)
| fix | Prevent leave animations on a move operation
([#&#8203;63745](https://redirect.github.com/angular/angular/pull/63745))
|

##### migrations

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------
|
|
[6e54bdfdcb](https://redirect.github.com/angular/angular/commit/6e54bdfdcb01522ee46865fadec911f960fff730)
| fix | fix route-lazy-loading migration
([#&#8203;63818](https://redirect.github.com/angular/angular/pull/63818))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.3.0`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2030-2025-09-10)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.2.4...20.3.0)

#### Breaking Changes

##### core

- The server-side bootstrapping process has been changed to eliminate
the reliance on a global platform injector.

  Before:

  ```ts
  const bootstrap = () => bootstrapApplication(AppComponent, config);
  ```

  After:

  ```ts
  const bootstrap = (context: BootstrapContext) =>
    bootstrapApplication(AppComponent, config, context);
  ```

A schematic is provided to automatically update `main.server.ts` files
to pass the `BootstrapContext` to the `bootstrapApplication` call.

In addition, `getPlatform()` and `destroyPlatform()` will now return
`null` and be a no-op respectively when running in a server environment.

(cherry picked from commit
[`8bf80c9`](https://redirect.github.com/angular/angular/commit/8bf80c9d2314b4f2bcf3df83ae01552a6fc49834))

#####

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------------
|
|
[a3f808d7c8](https://redirect.github.com/angular/angular/commit/a3f808d7c8cc59a4fd69f2e4b8d21a6510efa046)
| fix | remove refresh button from transfer state tab
([#&#8203;63592](https://redirect.github.com/angular/angular/pull/63592))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------------------------------------
|
|
[6117ccee2e](https://redirect.github.com/angular/angular/commit/6117ccee2e1507fb00549cd70e064282645db803)
| feat | introduce `BootstrapContext` for improved server bootstrapping
([#&#8203;63636](https://redirect.github.com/angular/angular/pull/63636))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.2.4`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2024-2025-09-03)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.2.3...20.2.4)

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------------------------------------
|
|
[dc64f3e478](https://redirect.github.com/angular/angular/commit/dc64f3e478c5cc1e354a0ff7cf5965b817b345d6)
| fix | Fixed inject migration schematics for migrate destructured
properties
([#&#8203;62832](https://redirect.github.com/angular/angular/pull/62832))
|

##### platform-server

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------------
|
|
[d1d32db972](https://redirect.github.com/angular/angular/commit/d1d32db97260c1e57c2937588002feb4271c7774)
| fix | prevent false warning for duplicate state serialization
([#&#8203;63525](https://redirect.github.com/angular/angular/pull/63525))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.2.3`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2023-2025-08-29)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.2.2...20.2.3)

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
----------------------------------------------------------------------------------------------------------------
|
|
[479a919f42](https://redirect.github.com/angular/angular/commit/479a919f42517193653384220adab5b89dd74e3d)
| fix | fixes regression with event parsing and animate prefix
([#&#8203;63470](https://redirect.github.com/angular/angular/pull/63470))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
----------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
[f87fad3fff](https://redirect.github.com/angular/angular/commit/f87fad3fff62cebf2868e06cba48e0f27b719d24)
| fix | avoid injecting internal error handler from a destroyed injector
([#&#8203;62275](https://redirect.github.com/angular/angular/pull/62275))
|
|
[114906d2d6](https://redirect.github.com/angular/angular/commit/114906d2d68d98c98961d858abd3ae714d4809a3)
| fix | Fix cancellation of animation enter classes
([#&#8203;63442](https://redirect.github.com/angular/angular/pull/63442))
|
|
[596b545130](https://redirect.github.com/angular/angular/commit/596b5451309b8ce4f08a1cd36e6b3610507d52f9)
| fix | Prevent an error on cleanup when an `rxResource` `stream` threw
before returning an `Observable`
([#&#8203;63342](https://redirect.github.com/angular/angular/pull/63342))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.2.2`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2022-2025-08-27)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.2.1...20.2.2)

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------------
|
|
[d7b6045d61](https://redirect.github.com/angular/angular/commit/d7b6045d61582d20a17802e769dc1441984988f0)
| fix | fixes animations on elements with structural directives
([#&#8203;63390](https://redirect.github.com/angular/angular/pull/63390))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
---------------------------------------------------------------------------------------------------------------
|
|
[6c421ed65d](https://redirect.github.com/angular/angular/commit/6c421ed65d050765a18eafc51fe7257abc5682ce)
| fix | Ensures `@for` loop animations never get cancelled
([#&#8203;63328](https://redirect.github.com/angular/angular/pull/63328))
|
|
[9093e0e132](https://redirect.github.com/angular/angular/commit/9093e0e132f99c2b590c31b299871bcd493b7de0)
| fix | fix memory leak with leaving nodes tracking
([#&#8203;63328](https://redirect.github.com/angular/angular/pull/63328))
|
|
[c8f07daf8f](https://redirect.github.com/angular/angular/commit/c8f07daf8f2c7e8c6641eb4368379a3f5f1d1f52)
| fix | Fixes `animate.leave` binding to a string with spaces
([#&#8203;63366](https://redirect.github.com/angular/angular/pull/63366))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.2.1`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2021-2025-08-21)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.2.0...20.2.1)

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
------------------------------------------------------------------------------------------------------------
|
|
[a28672fb70](https://redirect.github.com/angular/angular/commit/a28672fb7017cc62e42829c5910c3b39373d7913)
| fix | Keep paraenthesis in Nullish + Boolean expression.
([#&#8203;63292](https://redirect.github.com/angular/angular/pull/63292))
|

<!-- CHANGELOG SPLIT MARKER -->

###
[`v20.2.0`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2020-2025-08-20)

[Compare
Source](https://redirect.github.com/angular/angular/compare/20.1.8...20.2.0)

#### Deprecations

##### animations

-
[@&#8203;angular/animations](https://redirect.github.com/angular/animations)

##### core

-
[@&#8203;angular/animations](https://redirect.github.com/angular/animations)

##### router

- The Router.getCurrentNavigation method is deprecated. Use the
Router.currentNavigation signal instead.
- The Router.getCurrentNavigation method is deprecated. Use the
Router.currentNavigation signal instead.

##### animations

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| -------- |
------------------------------------------------------------------------------------------
|
|
[9766116cea](https://redirect.github.com/angular/angular/commit/9766116cea69607d80144251a599f1cc1b12e02c)
| refactor | deprecate the animations package
([#&#8203;62795](https://redirect.github.com/angular/angular/pull/62795))
|

##### compiler

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------------------------
|
|
[7767aa640c](https://redirect.github.com/angular/angular/commit/7767aa640c542f5058df9322f2bbe974fa8d3c81)
| fix | allow more characters in square-bracketed attribute names
([#&#8203;62742](https://redirect.github.com/angular/angular/pull/62742))
|
|
[7b51728813](https://redirect.github.com/angular/angular/commit/7b517288139aec166e5e5b60e84b1e22e3d6b70f)
| fix | fixes animation event host bindings not firing
([#&#8203;63217](https://redirect.github.com/angular/angular/pull/63217))
|

##### compiler-cli

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
---------------------------------------------------------------------------------------------------------------------------------
|
|
[5abfe4a899](https://redirect.github.com/angular/angular/commit/5abfe4a8999e42ad44e6f1d4414f241094bb8fdb)
| feat | add diagnostic for uninvoked functions in text interpolation
([#&#8203;59191](https://redirect.github.com/angular/angular/pull/59191))
|
|
[c4917074f1](https://redirect.github.com/angular/angular/commit/c4917074f1e278ea24948a8810b3d4f306765174)
| fix | display proper function in NG8117 message
([#&#8203;62842](https://redirect.github.com/angular/angular/pull/62842))
|
|
[812463c563](https://redirect.github.com/angular/angular/commit/812463c5636effe5bd5ba5c7c7fc65c3cc08d047)
| fix | Ignore diagnostics on ngTemplateContextGuard lines in TCB
([#&#8203;63054](https://redirect.github.com/angular/angular/pull/63054))
|
|
[45b030b5ce](https://redirect.github.com/angular/angular/commit/45b030b5ce1e116a88fe1c2fe133f654fb1f66c5)
| fix | prevent dom event assertion in TCB generation on older angular
versions
([#&#8203;63053](https://redirect.github.com/angular/angular/pull/63053))
|

##### core

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| -------- |
---------------------------------------------------------------------------------------------------------------------------
|
|
[6b1f4b9e8b](https://redirect.github.com/angular/angular/commit/6b1f4b9e8bb981377e271e6af0d9768ff7f765e9)
| feat | add enter and leave animation instructions
([#&#8203;62682](https://redirect.github.com/angular/angular/pull/62682))
|
|
[cec91c0035](https://redirect.github.com/angular/angular/commit/cec91c00356ee3974c39c9471b243a2a16149f5b)
| feat | add option to infer the tag names of components in tests
([#&#8203;62283](https://redirect.github.com/angular/angular/pull/62283))
|
|
[141bb75ff2](https://redirect.github.com/angular/angular/commit/141bb75ff241425a93ce5b60b56a4247e67d7648)
| feat | Promote zoneless to stable
([#&#8203;62699](https://redirect.github.com/angular/angular/pull/62699))
|
|
[4138aca91f](https://redirect.github.com/angular/angular/commit/4138aca91fe828f0cfbd779d0c456cdea7703bdc)
| feat | render ARIA property bindings as attributes
([#&#8203;62630](https://redirect.github.com/angular/angular/pull/62630))
|
|
[a409534d6c](https://redirect.github.com/angular/angular/commit/a409534d6c3d7cb4472afffd6b17df8c25e34106)
| feat | support `as` aliases on `else if` blocks
([#&#8203;63047](https://redirect.github.com/angular/angular/pull/63047))
|
|
[745ea44394](https://redirect.github.com/angular/angular/commit/745ea4439465494ab5b7002dd1fa320cd32220fb)
| feat | support TypeScript 5.9
([#&#8203;62541](https://redirect.github.com/angular/angular/pull/62541))
|
|
[593cc8a368](https://redirect.github.com/angular/angular/commit/593cc8a3684dfb163bfffa265c5efb3bc7efacd1)
| fix | checks if body exists before continuing
([#&#8203;62768](https://redirect.github.com/angular/angular/pull/62768))
|
|
[bdc31675b7](https://redirect.github.com/angular/angular/commit/bdc31675b7e5f37d2b312c766fe4963305620bdf)
| fix | ensure animate events do not have duplicate elements
([#&#8203;63216](https://redirect.github.com/angular/angular/pull/63216))
|
|
[de3a0c5cf3](https://redirect.github.com/angular/angular/commit/de3a0c5cf3f87782fa63d30edf6ac05eb6be9fac)
| fix | Fix `animate.enter` class removal when composing classes
([#&#8203;62981](https://redirect.github.com/angular/angular/pull/62981))
|
|
[6597ac0af7](https://redirect.github.com/angular/angular/commit/6597ac0af78ac2224ec2f9a37283b53aee11abe1)
| fix | fix support for space separated strings in leave animations
([#&#8203;62979](https://redirect.github.com/angular/angular/pull/62979))
|
|
[ebd622b344](https://redirect.github.com/angular/angular/commit/ebd622b3449789b72efc8295244ca924a299e7c1)
| fix | fixes empty animations when recalculating styles
([#&#8203;63007](https://redirect.github.com/angular/angular/pull/63007))
|
|
[455b147488](https://redirect.github.com/angular/angular/commit/455b147488dc0a064c0ca13a96a4df3c3ed01152)
| fix | fixes timing issues with enter animations
([#&#8203;62925](https://redirect.github.com/angular/angular/pull/62925))
|
|
[f9d73cc687](https://redirect.github.com/angular/angular/commit/f9d73cc6877d516da4ab4704c21bb19164123fa1)
| fix | handle cases where classes added have no animations
([#&#8203;63242](https://redirect.github.com/angular/angular/pull/63242))
|
|
[6a1184600c](https://redirect.github.com/angular/angular/commit/6a1184600ce0fc7a3f338d6766612e9510ef5518)
| fix | prevents duplicate nodes when `@if` toggles with leave
animations
([#&#8203;63048](https://redirect.github.com/angular/angular/pull/63048))
|
|
[063b5e166f](https://redirect.github.com/angular/angular/commit/063b5e166f66bce1abd06c258242212009e76cca)
| fix | switch check to documentElement with chaining
([#&#8203;62773](https://redirect.github.com/angular/angular/pull/62773))
|
|
[320de4e96d](https://redirect.github.com/angular/angular/commit/320de4e96d250cad1ce2c9f8c0fa2022da53b734)
| refactor | deprecate animations field on component interface
([#&#8203;62895](https://redirect.github.com/angular/angular/pull/62895))
|

##### forms

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------------------------
|
|
[c353497a01](https://redirect.github.com/angular/angular/commit/c353497a01776cd702af6c5136fdae5fc6ce94d5)
| feat | add support for pushing an array of controls to formarray
([#&#8203;57102](https://redirect.github.com/angular/angular/pull/57102))
|

##### http

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-----------------------------------------------------------------------------------------------------------------------------
|
|
[0984b30388](https://redirect.github.com/angular/angular/commit/0984b30388ef51dfad66f1228f665b89b73ef3fb)
| feat | Add redirected property to HttpResponse and HttpErrorResponse
([#&#8203;62675](https://redirect.github.com/angular/angular/pull/62675))
|
|
[be811fee79](https://redirect.github.com/angular/angular/commit/be811fee7925fb482567fa7cd9d485ac28acdade)
| feat | add referrer & integrity support for fetch requests in
httpResource
([#&#8203;62461](https://redirect.github.com/angular/angular/pull/62461))
|
|
[1cf9d9064c](https://redirect.github.com/angular/angular/commit/1cf9d9064c15c00071ece3b78c8019035a6db6ce)
| feat | Add support for fetch referrer & integrity options in
HttpClient
([#&#8203;62417](https://redirect.github.com/angular/angular/pull/62417))
|
|
[1408baff45](https://redirect.github.com/angular/angular/commit/1408baff453e636da05838fa17c6e4abd86c4b72)
| fix | Add missing timeout and transferCache options to `HttpClient`
([#&#8203;62586](https://redirect.github.com/angular/angular/pull/62586))
|

##### language-service

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
--------------------------------------------------------------------------------------------------------------
|
|
[c81e345e72](https://redirect.github.com/angular/angular/commit/c81e345e726b5b281621159c789e6d80a9f328e2)
| feat | support auto-import for attribute completions
([#&#8203;62797](https://redirect.github.com/angular/angular/pull/62797))
|
|
[d64dd27a02](https://redirect.github.com/angular/angular/commit/d64dd27a02630b631bc9890d7292d4683493cb65)
| feat | support to report the deprecated API in the template
([#&#8203;62054](https://redirect.github.com/angular/angular/pull/62054))
|
|
[591c7e2ec8](https://redirect.github.com/angular/angular/commit/591c7e2ec82c6669ffa6e0011b8a0a4fc12e9c3a)
| fix | Support to resolve the re-export component.
([#&#8203;62585](https://redirect.github.com/angular/angular/pull/62585))
|

##### platform-browser

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
----------------------------------------------------------------------------------------------------------------
|
|
[52b8e07d6e](https://redirect.github.com/angular/angular/commit/52b8e07d6e568a527fae18a8a867dacdf8053e20)
| feat | Warns on conflicting hydration and blocking navigation
([#&#8203;62963](https://redirect.github.com/angular/angular/pull/62963))
|

##### router

| Commit | Type | Description |
|
------------------------------------------------------------------------------------------------
| ---- |
-------------------------------------------------------------------------------------------------------------------
|
|
[d00b3fed58](https://redirect.github.com/angular/angular/commit/d00b3fed58496369d9f3a1ac0d74416a586be78b)
| feat | add a `currentNavigation` signal to the `Router` service.
([#&#8203;62971](https://redirect.github.com/angular/angular/pull/62971))
|
|
[687c374826](https://redirect.github.com/angular/angular/commit/687c374826c5e9ea91839c20f0df815ce085c583)
| feat | add a currentNavigation signal to the Router service.
([#&#8203;63011](https://redirect.github.com/angular/angular/pull/63011))
|
|
[9c45c322d1](https://redirect.github.com/angular/angular/commit/9c45c322d1ac3b05c916b7c956263066fb9be47f)
| fix | ensure preloaded components are properly activated
([#&#8203;62502](https://redirect.github.com/angular/angular/pull/62502))
|

##### service-worker

| Commit                                                      

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xOS45IiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/react](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react))
| [`18.3.18` ->
`18.3.27`](https://renovatebot.com/diffs/npm/@types%2freact/18.3.18/18.3.27)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2freact/18.3.27?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2freact/18.3.18/18.3.27?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xOS45IiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…#1305)

## This PR

Updates the no-op logic in useContextMutator's setContext method to
compare against the actual previous context as returned by OpenFeature
itself, rather than just the previous context that that specific use of
useContextMutator had in its ref
(#1301 (comment)).

Building on #1301, this should allow for setContext to be called with a
method, and for that method to return the context it was provided, to
guarantee a no-op always.

Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
## This PR

As identified in
#1305 (comment),
the signature + JSDoc for this hook method indicates it returns a
Promise you can await for the context change, however, the actual logic
within the method did not await the underlying setContext calls -- it
now does.

Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
🤖 I have created a release *beep* *boop*
---


##
[1.20.1](server-sdk-v1.20.0...server-sdk-v1.20.1)
(2025-12-09)


### 🐛 Bug Fixes

* multi-provider hook context management
([#1282](#1282))
([2f9e0d3](2f9e0d3))


### 🧹 Chore

* update copyright to OpenFeature Maintainers
([#1283](#1283))
([d751b8b](d751b8b))


### 📚 Documentation

* add Multi-Provider to features list in README's
([#1269](#1269))
([752fa0d](752fa0d))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---


##
[1.7.2](web-sdk-v1.7.1...web-sdk-v1.7.2)
(2025-12-09)


### 🧹 Chore

* update copyright to OpenFeature Maintainers
([#1283](#1283))
([d751b8b](d751b8b))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
🤖 I have created a release *beep* *boop*
---


##
[1.1.0](react-sdk-v1.0.2...react-sdk-v1.1.0)
(2025-12-09)


### ✨ New Features

* allow method to be passed into setContext hook
([#1301](#1301))
([279f9bf](279f9bf))


### 🐛 Bug Fixes

* await context change in useContextMutator setContext
([#1306](#1306))
([7ef721a](7ef721a))
* compare full EvaluationDetails to prevent stale data
([#1287](#1287))
([8133a4f](8133a4f))
* in-line docs, un-needed AbortController creation
([#1291](#1291))
([9b05be9](9b05be9))
* use actual previous context to noop useContextMutator setContext
([#1305](#1305))
([4d15a86](4d15a86))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
## This PR

Enables Prettier for the repository, adding scripts to the root package
for checking + applying formatting. Adds a new CI job to check
formatting on PRs (and also moves the lint to there, as I don't think
lint needs to run across the Node.js version matrix).

I've also added husky + lint-staged to automatically run Prettier
against files being committed locally, but happy to pull that back out
if folks would prefer not to have that.

### Related Issues

Resolves #1302 

### Notes

I'd recommend reviewing the commits individually, except the last
commit, which was just the result of actually running Prettier.

---------

Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
andomain and others added 7 commits December 11, 2025 02:18
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR

This PR removes the explicit `JSX.Element` return type from the type
signature of the React SDK `OpenFeatureProvider`.
`JSX.Element` is narrow for React 19+ as types have widened to include
Portals etc. & this was throwing TS compilation errors


### Related Issues

Fixes #1307

### Notes
As this is purely a type change I didn't feel it necessary to add
additional tests, happy to investigate further if required though

Signed-off-by: Sam <sam@andomain.co.uk>
## This PR
Adds Angular 21 support

### Related Issues
Fixes #1314 

### Notes
@angular-eslint has also been updated to v21

---------

Signed-off-by: Charles Capon <charles.capon@edf.fr>
🤖 I have created a release *beep* *boop*
---


##
[0.0.20](angular-sdk-v0.0.19...angular-sdk-v0.0.20)
(2025-12-16)


### ✨ New Features

* Angular 21 support
([#1316](#1316))
([7d1bfb2](7d1bfb2))


### 🧹 Chore

* mention debounce hook in react/ng docs
([#1272](#1272))
([27666b8](27666b8))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
## This PR
- Remove redundant loop for updating the before hook contexts
- Add simple test case to make sure the same object reference is being
updated

### Related Issues
<!-- add here the GitHub issue that this PR resolves if applicable -->

#1236

### Notes
The accumulated evaluation context object is shared with all the hooks
(same object reference). This makes the inner for loop for updating the
contexts redundant


### How to test
```npm run test```

---------

Signed-off-by: Marko Mlakar <markomlakar2@gmail.com>
Signed-off-by: MarkoMlakar <marko.mlakar@dynatrace.com>
## This PR
Introduces the FeatureFlag component for React that allow using feature
flags in a declarative manner

### Related Issues
No ticket

### Notes
Maybe consider adding a similar component for other supported
frameworks?

### Follow-up Tasks
<!-- anything that is related to this PR but not done here should be
noted under this section -->
<!-- if there is a need for a new issue, please link it here -->

### How to test
I have written unit tests to cover the main features of the component

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: marcozabel <marco.zabel@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
This PR is adding evaluation options to the FeatureFlag component to
allow the use of suspend options.

### Related Issues
<!-- add here the GitHub issue that this PR resolves if applicable -->

#1321

### Notes
<!-- any additional notes for this PR -->

### Follow-up Tasks
<!-- anything that is related to this PR but not done here should be
noted under this section -->
<!-- if there is a need for a new issue, please link it here -->

### How to test
<!-- if applicable, add testing instructions under this section -->

---------

Signed-off-by: marcozabel <marco.zabel@dynatrace.com>
@jonathannorris jonathannorris force-pushed the feat-shared-multi-provider branch 2 times, most recently from 0a63931 to c24d7e6 Compare January 2, 2026 03:16
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
…types

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
@jonathannorris jonathannorris force-pushed the feat-shared-multi-provider branch from c24d7e6 to 52d8268 Compare January 2, 2026 03:20
- Remove redundant 'provider as Provider' casts where type is already known
- Add proper type definitions for StatusTracker enums to eliminate 'as TProviderEvents' casts
- Use variable narrowing for optional Reconciling event/status

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
These files are now obsolete as the types are imported from the shared
@openfeature/core package.

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
- Add comprehensive tests for StatusTracker event handling and status priority
- Add tests for constructAggregateError including empty array edge case
- Add tests for throwAggregateErrorFromPromiseResults
- Fix AggregateError prototype chain for proper instanceof checks

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Keep AllProviderStatus as an alias of ClientProviderStatus instead of
creating a new enum, to maintain backward compatibility.

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
…ic API

- Create FirstMatchStrategy, FirstSuccessfulStrategy, ComparisonStrategy
  wrapper classes in server and web SDKs with ProviderStatus pre-bound
- Rename base strategies to BaseFirstMatchStrategy, etc. in @openfeature/core
- Update READMEs with simplified custom strategy documentation
- Users can now use strategies without passing ProviderStatus:
  new FirstMatchStrategy() instead of new FirstMatchStrategy(ProviderStatus)

Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
@jonathannorris jonathannorris force-pushed the feat-shared-multi-provider branch from 849f66a to 97eb2ea Compare January 2, 2026 05:01
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.